package sige.cive

import sige.DespesaFixa
import sige.Pagamento
import java.util.Calendar

class DespesaFixaJob {

    def concurrent = false
    static triggers = {
        cron name:'cronTrigger', startDelay:0, cronExpression: '0 0 1 ? * *'
    }
    
    def execute() {
        def despesas = DespesaFixa.findAllByAtiva(true)
        
        for(d in despesas){
            Date ultimo = ultimoPagamento(d)
            def inserido = verificaUltimo(d.pagamentos, ultimo)
            if(!inserido){
                inserirPagamento(d, ultimo)
            }
            
        }
    }
    
    void inserirPagamento(def despesa, Date data){
        Pagamento pagamento = new Pagamento()
        pagamento.valor = despesa.valorBase
        pagamento.pago = false
        pagamento.dataDeVencimento = data
        pagamento.save(flush: true)
    }
    
    boolean verificaUltimo(def pagamentos,Date ultimo){
        for (p in pagamentos){
            if(p.dataDeVencimento == ultimo){
                return true
            }
        }
        return false
    }
    
    Date ultimoPagamento(def desp){
        Date d = new Date().clearTime()
        Calendar c = despesa.dataDeVencimento.toCalendar()
        
        switch(despesa.sazonalidade){
            case "Anual":
            while(c.time <= d){
                c.roll(Calendar.YEAR, 1)//andou um ano
            }
            break
            
            case "Mensal":
            while(c.time <= d){
                int ant = c[Calendar.MONTH]
                c.roll(Calendar.MONTH, 1)//andou um mês
                if(c[Calendar.MONTH] < ant){
                    c.roll(Calendar.YEAR, 1)
                }
            }
            break
            
            case "Semanal":
            while(c.time <= d){
                int ant = c[Calendar.MONTH]
                c.roll(Calendar.WEEK_OF_YEAR, 1)//andou uma semana
                if(c[Calendar.MONTH] < ant){
                    c.roll(Calendar.YEAR, 1)
                }
            }
            break
        }
        
        return c.time
    }
}
